// src/utils/request.js
// 该文件是用来 二次 封装 axios 用的
import axios from 'axios'
import type { AxiosInstance } from 'axios'

// 开发环境(写代码的阶段)  development
// 生产环境(代码已经写好已经部署到服务器了) production
// 测试环境(代码已经写好了但是还没有部署) production
// process.env.NODE_ENV 用来获取我们当前的环境
// const isDev = process.env.NODE_ENV == 'development'

// 创建一个请求对象
const request: AxiosInstance = axios.create({
  // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  // baseURL: isDev ? 'http://121.89.205.189:3000/admin' : 'http://121.89.205.189:3000/admin',
  baseURL: 'http://121.89.205.189:3000/api',
  // `timeout` 指定请求超时的毫秒数。
  // 如果请求时间超过 `timeout` 的值，则请求会被中断
  timeout: 60000, // 默认值是 `0` (永不超时)
})

// 添加请求拦截器
// 请求拦截器作用，携带公共参数
request.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // config 请求配置，里面有请求的参数，请求的 url

  // console.log(localStorage.getItem('token'));
  // 1. 先获取 token
  const token = localStorage.getItem('token')
  // 2. 设置 token
  config.headers.token = token

  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});


// 添加响应拦截器
// 拦截错误信息。比如 常见的请求状态码
// 拦截 10119 token 无效，无效后重新进入登录页面
request.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  // response 是我们请求之后的结果

  // console.log('111111111111111', response.data.code);
  // if (response.data.code === '10119') {
  //   // token 无效,之后我们可以重新登录
  //   localStorage.clear()
  //   location.href = '/#/login'
  // }

  return response;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});


interface iConfig {
  url: string
  method?: string
  data?: any
  headers?: any
}
// ajax 自定义各种数据请求的方法
export default function ajax (config:iConfig) {
  // 1. 先获取到请求的一些必要参数
  const { url = '', method = 'GET', data = {}, headers = {} } = config

  // 2. 判断我们请求的类型是 get 还是 post 还是其他
  switch (method.toUpperCase()) {
    case 'GET':
      //  get  请求
      // get 请求的参数我们需要放在 params 中
      return request.get(url, { params: data })

    case 'POST':
      //  post  请求

      // 1. 表单提交数据
      if (headers['content-type'] == 'application/x-www-form-url-encoded') {
        //  如果提交的是表单数据我们需要格式化数据
        const obj = new URLSearchParams()
        for (const key in data) {
          obj.append(key, data[key])
        }
        return request.post(url, obj, { headers })
      }
      // 2. 文件数据
      if (headers['content-type'] == 'multipart/form-data') {
        const obj = new FormData()
        for (const key in data) {
          obj.append(key, data[key])
        }
        return request.post(url, obj, { headers })
      }

      // 3. json 数据
      return request.post(url, data)

    case 'PUT':
      // 通常用来修改数据用的 --- 数据更新

      return request.put(url, data)
    case 'DELETE':
      // 删除数据

      return request.delete(url, { data })
    case 'PATCH':
      // 更新局部资源

      return request.patch(url, data)

    default:
      // 如果前面全部都不是
      return request.request(config)
  }


}
